主题
匹配图片5 - MatchImagePtrFromPathAll
函数简介
匹配所有符合模板图片的位置信息,源图通过内存指针传入,模板通过文件路径指定。
接口名称
MatchImagePtrFromPathAllDLL调用
long MatchImagePtrFromPathAll(long ola, long source, string templ, double matchVal, int type, double angle, double scale);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| ola | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| source | 长整数型 | OLAImage对象的地址(源图片)。 |
| templ | 字符串 | 模板图片的路径,可用 | 分隔多图,如 "test.bmp|test2.bmp|test3.bmp"。默认任一模板不存在或加载失败时整次返回空;可通过 SetConfigByKey 设置 MultiTemplateAbortOnInvalidImage=false 跳过无效模板继续匹配。 |
| matchVal | 双精度浮点数 | 相似度,如0.85,最大为1。 |
| type | 整数型 | 匹配类型:1-灰度匹配(速度快);2-彩色匹配;3-透明匹配;4-透明彩色权重匹配;5-普通彩色匹配。 |
| angle | 双精度浮点数 | 旋转角度,每次匹配后旋转指定角度继续匹配,角度越小匹配次数越多时间越长,0为不旋转速度最快。 |
| scale | 双精度浮点数 | 源图缩放比例,默认为1,可通过GetScaleFromWindows接口获取。 |
示例
SDK 调用
cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/scene.png");
if (imgPtr != 0) {
auto results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
if (!results.empty() && results[0].MatchState) {
int x = results[0].X;
int y = results[0].Y;
}
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr);
}csharp
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.LoadImage("images/scene.png");
if (imgPtr != 0)
{
var results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
if (results.Count > 0 && results[0].MatchState)
{
int x = results[0].X;
int y = results[0].Y;
}
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
ola = OLAPlugServer()
img_ptr = ola.LoadImage("images/scene.png")
if img_ptr:
results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1)
if results and results[0].get("MatchState"):
x = results[0]["X"]
y = results[0]["Y"]
# 后续不再使用该模板图时释放
ola.FreeImage(img_ptr)java
import com.olaplug.OLAPlugServer;
import com.olaplug.model.MatchResult;
import java.util.List;
OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.LoadImage("images/scene.png");
if (imgPtr != 0) {
List<MatchResult> results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
if (results != null && !results.isEmpty() && results.get(0).MatchState) {
int x = results.get(0).X;
int y = results.get(0).Y;
}
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr);
}go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.LoadImage("images/scene.png")
if imgPtr != 0 {
auto results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1)
if (!results.empty() && results[0].MatchState) {
x := results[0].X
y := results[0].Y
}
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr)
}rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.load_image("images/scene.png");
if imgPtr != 0 {
auto results = ola.match_image_ptr_from_path_all(imgPtr, "img/template.bmp", 0.9, 1, 0, 1)
if (!results.empty() && results[0].MatchState) {
let x = results[0].X;
let y = results[0].Y;
}
// 后续不再使用该模板图时释放
ola.free_image(imgPtr);
}cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.LoadImage("images/scene.png")
if(imgPtr) {
var results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1)
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.LoadImage("images/scene.png")
If imgPtr <> 0 Then
results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1)
' 后续不再使用该模板图时释放
ola.FreeImage(imgPtr)
End Iftext
.局部变量 ola, OLAPlug
.局部变量 retData, MatchData, , 数组
.局部变量 count, 整数型
.局部变量 rawstring, 文本型
.局部变量 imgPtr, 长整数型
ola.创建 ()
imgPtr = ola.LoadImage ("images/scene.png")
.如果真 (imgPtr ≠ 0)
count = ola.MatchImagePtrFromPathAll (imgPtr, "img/template.bmp", 0.9, 1, 0, 1, retData, rawstring)
' rawstring 为原始 JSON 文本(可省略该参数)
.如果真 (count > 0)
' retData 下标从 1 开始
.如果真结束
ola.FreeImage (imgPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.LoadImage("images/scene.png");
if(imgPtr){
var results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr);
}text
变量 ola <类型 = OLAPlugServer>
变量 results <类型 = MatchDataList>
变量 imgPtr <类型 = 长整数>
ola = 新建 OLAPlugServer
imgPtr = ola.LoadImage("images/scene.png")
如果真 (imgPtr ≠ 0)
results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1)
ola.FreeImage(imgPtr)
结束cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/scene.png");
if (imgPtr != 0) {
auto results = ola.MatchImagePtrFromPathAll(imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
if (!results.empty() && results[0].MatchState) {
int32_t x = results[0].X;
}
// 后续不再使用该模板图时释放
ola.FreeImage(imgPtr);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long ptr = MatchImagePtrFromPathAll(instance, imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
if (ptr != 0) {
char json[8192] = {0};
GetStringFromPtr(ptr, json, sizeof(json));
int matchState = 0, x = 0, y = 0, width = 0, height = 0, index = 0;
double matchVal = 0, angle = 0;
ParseMatchImageAllJson(instance, json, 0, &matchState, &x, &y, &width, &height, &matchVal, &angle, &index);
FreeStringPtr(instance, ptr);
}csharp
using System.Runtime.InteropServices;
using System.Text;
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetStringFromPtr(long ptr, StringBuilder lpString, int size);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int FreeStringPtr(long ptr);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetStringSize(long ptr);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern long CreateCOLAPlugInterFace();
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern long MatchImagePtrFromPathAll(long ola, long source, string templ, double matchVal, int type, double angle, double scale);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int ParseMatchImageAllJson(string str, int parseIndex, out int matchState, out int x, out int y, out int width, out int height, out double matchVal, out double angle, out int index);
long instance = CreateCOLAPlugInterFace();
long ptr = MatchImagePtrFromPathAll(instance, imgPtr, "img/template.bmp", 0.9, 1, 0, 1);
if (ptr != 0) {
StringBuilder sb = new StringBuilder(GetStringSize(ptr) + 1);
GetStringFromPtr(ptr, sb, sb.Capacity);
FreeStringPtr(ptr);
ParseMatchImageAllJson(sb.ToString(), 0, out int matchState, out int x, out int y, out int w, out int h, out double mv, out double ang, out int idx);
}python
from ctypes import CDLL, c_int, c_int64
ola = CDLL("OLAPlug_x64.dll")
ola.CreateCOLAPlugInterFace.restype = c_int64
instance = ola.CreateCOLAPlugInterFace()
ptr = ola.MatchImagePtrFromPathAll(instance, ...)
# 原生返回 JSON 数组指针,用 ParseMatchImageAllJson(instance, json, 0, ...) 取第一项返回值
| 调用方式 | 返回值 | 说明 |
|---|---|---|
| SDK | MatchData/MatchResult 列表(Python 为 list[dict]) | 全部匹配结果;空列表表示未找到 |
| SDK(火山) | MatchDataList | 结构化结果列表 |
| SDK(易语言) | 整数型 + retData(MatchData 数组) | 返回找到数量,结果写入 retData;内部为 GetStringFromPtr + OL_获取MatchDataAll |
| 原生 DLL | 非 0 | 成功,返回 JSON 数组字符串指针,需调用 FreeStringPtr 释放 |
| 原生 DLL | 0 | 失败 |
返回数据格式:
json
[{
"MatchVal": 0.85,
"MatchState": true,
"Index": 0,
"Angle": 45.0,
"X": 100,
"Y": 200,
"Width": 100,
"Height": 100
}]| 字段名 | 类型 | 说明 |
|---|---|---|
| MatchVal | 浮点数 | 匹配相似度。 |
| MatchState | 布尔 | 是否匹配成功。 |
| Index | 整数 | 结果索引(从 0 开始)。 |
| Angle | 浮点数 | 匹配角度。 |
| X | 整数 | X 坐标。 |
| Y | 整数 | Y 坐标。 |
| Width | 整数 | 宽度。 |
| Height | 整数 | 高度。 |
相关配置
| 配置项 | 类型 | 默认 | 说明 |
|---|---|---|---|
| MultiTemplateAbortOnInvalidImage | bool | true | 多模板路径 | 分隔时,某一图不存在或加载失败:true(默认)整次返回空;false 跳过无效模板继续匹配(全局配置,见 SetConfigByKey)。 |
